#include <bits/stdc++.h>
using namespace std;

/*

*/ 

// 法一
class Solution {
public:
    vector<int> findEvenNumbers(vector<int>& digits) {
        set<int> ans;
        int n = digits.size();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == j)     continue;
                for (int k = 0; k < n; k++) {
                    if (i == k || j == k)   continue;
                    int num = digits[i] * 100 + digits[j] * 10 + digits[k];
                    if (digits[i] != 0 && digits[k] % 2 == 0)   ans.insert(num);
                }
            }
        }
        return vector<int>(ans.begin(), ans.end()) ;
    }
};

// 法二
class Solution {
public:
    vector<int> findEvenNumbers(vector<int>& digits) {
        // 步骤1：统计每个数字（0-9）出现的次数
        vector<int> cnt(10, 0);  // 初始化计数器数组，索引0-9对应数字0-9
        for (auto& d : digits) {
            cnt[d]++;  // 遍历输入数组，统计每个数字的出现次数
        }
        vector<int> ans;  // 存储最终结果的数组
        // 步骤2：遍历所有可能的三位数（100-999）
        for (int i = 100; i <= 999; ++i) {
            // 跳过奇数，只处理偶数
            if (i & 1) {
                continue;
            }

            // 分解数字i的百位(x)、十位(y)、个位(z)
            int x = i / 100;     // 百位数
            int y = i / 10 % 10; // 十位数
            int z = i % 10;      // 个位数

            // 步骤3：临时减少计数器中对应数字的计数
            cnt[x]--, cnt[y]--, cnt[z]--;
            // 步骤4：检查当前数字i是否可以由输入数字构成
            // 如果任何数字的计数变为负数，说明输入数字不足以构成当前数字i
            if (cnt[x] < 0 || cnt[y] < 0 || cnt[z] < 0) {
                // 不满足条件，不做任何操作
            } else {
                // 满足条件，将数字i加入结果数组
                ans.emplace_back(i);
            }
            // 步骤5：恢复计数器中数字的计数（因为只是临时检查）
            cnt[x]++, cnt[y]++, cnt[z]++;
        }
        // 步骤6：返回结果数组（自动按升序排列，因为i是从小到大遍历的）
        return ans;
    }
};
